知っておくと便利!Pytestコマンドライン小ネタ集
Pytestを実行するときに知っておくと便利なコマンド&オプションをまとめました。
環境
- Python3.6
- pytest 4.3.0
- venv
特定のテストのみを実行する
モジュールを指定して実行
モジュール毎にテストを実行します。
pytest test_1.py
パスを指定して実行
フォルダ別にテストを実行します。
pytest testing/
キーワードを指定して実行
文字列に含まれるキーワードにマッチするもののみを実行します。 マッチング対象はファイル名、クラス名、関数名です。
pytest -k "MyClass and not method"
上の例の場合、”TestMyClass”のキーワードを含むテストを実行しますが、”method”キーワードを含むものは除きます。
例えば、 "TestMyClass.test_something" は実行されますが、 ”TestMyClass.test_method_simple”は実行されません。
このように文章で記述できるのはPythonらしいですよね。
ノードIDを指定して実行
全てのテスト関数にはそれぞれIDが振られます。 IDの形式は”<モジュール名>::<クラス名 or 関数名 or パラメーター名>”です。 モジュール内のテストを個別に実行したい時に役立ちます。
例えば、以下の書き方だと、test_modモジュールのtest_funcのみを実行します。
pytest test_mod.py::test_func
以下の書き方の例はmodule内のクラスを指定してtest_method関数を実行します。
pytest test_mod.py::TestClass::test_method
*パス指定して呼び出す場合* Pytestコマンドはディレクトリ内の”test”キーワードがあるフォルダ内の関数も探して実行してくれますが、 パス指定をする場合はディレクトリを指定しなければ実行してくれません。
実行元ディレクトリからのパスを入力するようにしましょう。
デコレータ別に実行
以下のコードは@pytest.mark.slowのデコレータが付いている関数のみ実行します。
pytest -m slow
他のデコレータに付いては Marksを参考にしてください。
n回数失敗したらテストを中止
数を指定して、その回数テストが失敗するとテストを終了し結果を表示します。
pytest -x # テストに一度でも失敗した時点で停止 pytest --maxfail=2 # テストに二回失敗した時点で停止
テストの停止+デバッガープロンプトの起動
数を指定してテストを停止することができます。 Pytestはビルトインのデバッガー、PDB(Python Debugger)を用いてテストを実行していますが、 --pdbオプションでテストが任意の回数失敗した時点でテストを停止し、PDBプロンプトを表示します。
pytest -x --pdb # テストに失敗した時点でテストを中止しPDBプロンプトを起動。 pytest --pdb --maxfail=3 # テストに3回通らなかった時点でテストを中止しPDBプロンプトを起動。
デバッグモードになったら helpでオプションを表示、もしくはqでデバッグモードを終了します。
テストに失敗した時、実行ログはsys.last_value, sys.last_type and sys.last_tracebackに保存されます。
sysモジュールから手動で例外でログの内容を見たり、他のデバッグツールで分析したりできるようです。
>>> import sys >>> sys.last_traceback.tb_lineno 42 >>> sys.last_value AssertionError('assert result == "ok"',)
実行時間を表示する
--durationで実行時間を表示します。
pytest --durations=10 #もっとも時間のかかったテストを順に10表示
処理時間が0.01sより短いものはデフォルトで表示されませんが、 -vvオプションを渡すことで表示させることもできます。
サマリーレポートの表示
*pytest version 2.9以上 全てのテストが終了した後に表示されるサマリーレポートをカスタマイズできます。
-r フラグを使うことでテストの最後に“short test summary info”を表示します。 -rフラグに任意のオプションを指定することで、failures, skips, xfailsなどをサマリーに表示します。
以下オプション一覧です。
- f - failed
- E - error
- s - skipped
- x - xfailed
- X - xpassed
- p - passed
- P - passed with output
- a - all except pP
例えば、pytest -rfsの場合、失敗したテストとskipしたテストのショートサマリを表示します。
$ pytest -rfs =========================== test session starts ============================ platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y cachedir: $PYTHON_PREFIX/.pytest_cache rootdir: $REGENDOC_TMPDIR, inifile: collected 6 items test_example.py .FEsxX [100%] ================================== ERRORS ================================== _______________________ ERROR at setup of test_error _______________________ @pytest.fixture def error_fixture(): > assert 0 E assert 0 test_example.py:6: AssertionError ================================= FAILURES ================================= ________________________________ test_fail _________________________________ def test_fail(): > assert 0 E assert 0 test_example.py:14: AssertionError ========================= short test summary info ========================== FAILED test_example.py::test_fail SKIPPED [1] $REGENDOC_TMPDIR/test_example.py:23: skipping this test 1 failed, 1 passed, 1 skipped, 1 xfailed, 1 xpassed, 1 error in 0.12 seconds
まとめ
以上、よく使いそうなコマンドオプションをまとめてみました。 少しでも皆様のpytestライフの助けになれれば幸いです。